/*
 * SPDX-FileCopyrightText: 2022-2024 Andrew Gunnerson
 * SPDX-License-Identifier: GPL-3.0-only
 */

@file:OptIn(ExperimentalUnsignedTypes::class)

package com.sanji.audio_test.format

import android.media.MediaFormat
import java.io.FileDescriptor

/**
 * FLAC (Free Lossless Audio Codec) 音频格式实现类
 * 
 * FLAC 是一种无损音频压缩格式，能够完美保留原始音频质量，
 * 适用于对音质要求较高的录音场景。
 */
class FlacFormat : Format() {
    /** 格式名称 */
    override val name: String = "FLAC"
    
    /** 容器 MIME 类型 */
    override val mimeTypeContainer: String = MediaFormat.MIMETYPE_AUDIO_FLAC
    
    /** 音频 MIME 类型 */
    override val mimeTypeAudio: String = MediaFormat.MIMETYPE_AUDIO_FLAC
    
    /** 是否支持直通模式 */
    override val passthrough: Boolean = false
    
    /** 
     * FLAC 格式参数信息
     * 
     * 支持的压缩级别范围为 0-8
     * 默认压缩级别为 8（最高压缩率）
     * 现代设备性能足够强大，可以实时使用最高压缩级别进行录音
     */
    override val paramInfo: FormatParamInfo = RangedParamInfo(
        RangedParamType.CompressionLevel,
        0u..8u,
        // 现今的设备性能足够强大，可以在实时录音中使用最高压缩级别
        8u,
        uintArrayOf(0u, 5u, 8u),
    )
    
    /** 
     * 采样率信息
     * 
     * FLAC 标准采样率为 16kHz
     */
    override val sampleRateInfo: SampleRateInfo =
        SampleRateInfo.fromCodec(baseMediaFormat, 16_000u)

    /**
     * 更新媒体格式参数
     * 
     * @param mediaFormat 媒体格式对象
     * @param param 指定的压缩级别参数
     */
    override fun updateMediaFormat(mediaFormat: MediaFormat, param: UInt) {
        mediaFormat.apply {
            // 对于无损格式不相关
            setInteger(MediaFormat.KEY_BIT_RATE, 0)
            // 设置FLAC压缩级别
            setInteger(MediaFormat.KEY_FLAC_COMPRESSION_LEVEL, param.toInt())
        }
    }

    /**
     * 创建FLAC容器实例
     * 
     * @param fd 文件描述符
     * @return FlacContainer 实例
     */
    override fun getContainer(fd: FileDescriptor): Container =
        FlacContainer(fd)
}